package com.sadam.ui4.Utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 图像工具类：提供用户头像的保存与加载功能。
 * 所有方法均为静态，无需实例化。
 * 头像文件存储在应用私有目录中，格式为 PNG。
 */
public class ImageUtils {
    private static final String TAG = "ImageUtils";

    /** 头像文件名前缀 */
    private static final String AVATAR_PREFIX = "avatar_";
    /** 头像文件扩展名 */
    private static final String AVATAR_SUFFIX = ".png";
    /** 最大重试次数（写入失败时） */
    private static final int MAX_RETRY_COUNT = 3;
    /** 默认存储路径 */
    public static final String DEFAULT_AVATAR = "default_avatar";

    /**
     * 将指定 Bitmap 保存为用户头像文件。
     * 文件存储路径：context.getFilesDir()/avatar_{userId}.png
     *
     * @param context  上下文环境，用于获取文件存储目录，不能为 null
     * @param bitmap   要保存的 Bitmap 对象，不能为 null
     * @param userId   用户唯一标识符，用于生成文件名
     * @return 成功时返回头像文件的绝对路径；失败时返回 null
     *
     * @throws IllegalArgumentException 如果 context 或 bitmap 为 null
     */
    public static String saveAvatar(Context context, Bitmap bitmap, long userId) {
        // 参数校验
        if (context == null) {
            Log.e(TAG, "Context is null. Cannot save avatar for user " + userId);
            throw new IllegalArgumentException("Context cannot be null");
        }
        if (bitmap == null) {
            Log.e(TAG, "Bitmap is null. Cannot save avatar for user " + userId);
            return null; // 不抛异常，避免 UI 崩溃，返回 null 表示失败
        }

        File file = new File(context.getFilesDir(), AVATAR_PREFIX + userId + AVATAR_SUFFIX);

        // 确保父目录存在（虽然 getFilesDir() 总是存在，但更健壮）
        File parentDir = file.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            if (!parentDir.mkdirs()) {
                Log.e(TAG, "Failed to create parent directory for avatar: " + file.getAbsolutePath());
                return null;
            }
        }

        // 尝试写入，最多重试 MAX_RETRY_COUNT 次
        for (int i = 0; i < MAX_RETRY_COUNT; i++) {
            try (FileOutputStream out = new FileOutputStream(file)) {
                boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                if (success) {
                    Log.d(TAG, "Successfully saved avatar for user " + userId + " at " + file.getAbsolutePath());
                    return file.getAbsolutePath();
                } else {
                    Log.w(TAG, "Bitmap compression returned false for user " + userId);
                }
            } catch (IOException e) {
                Log.e(TAG, "IOException while saving avatar for user " + userId +
                        " (attempt " + (i + 1) + "/" + MAX_RETRY_COUNT + ")", e);
                if (i == MAX_RETRY_COUNT - 1) {
                    // 最后一次尝试也失败了
                    Log.e(TAG, "Failed to save avatar after " + MAX_RETRY_COUNT + " attempts.");
                }
                // 删除可能损坏的文件
                if (file.exists() && !file.delete()) {
                    Log.w(TAG, "Failed to delete corrupted avatar file: " + file.getAbsolutePath());
                }
            } catch (Exception e) {
                // 捕获其他意外异常（如 OutOfMemoryError 风险）
                Log.e(TAG, "Unexpected error saving avatar for user " + userId, e);
                break; // 不重试
            }
        }

        return null;
    }

    /**
     * 从文件系统加载指定用户的头像 Bitmap。
     *
     * @param context 上下文环境，用于获取文件存储目录，不能为 null
     * @param userId  用户唯一标识符，用于定位头像文件
     * @return 如果文件存在且解码成功，返回 Bitmap；否则返回 null
     *
     * @throws IllegalArgumentException 如果 context 为 null
     */
    public static Bitmap loadAvatar(Context context, long userId) {
        if (context == null) {
            Log.e(TAG, "Context is null. Cannot load avatar for user " + userId);
            throw new IllegalArgumentException("Context cannot be null");
        }

        File file = new File(context.getFilesDir(), AVATAR_PREFIX + userId + AVATAR_SUFFIX);

        if (!file.exists()) {
            Log.d(TAG, "Avatar file not found for user " + userId + ": " + file.getAbsolutePath());
            return null;
        }

        if (!file.canRead()) {
            Log.e(TAG, "Cannot read avatar file: " + file.getAbsolutePath());
            return null;
        }

        try {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888; // 明确指定配置

            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
            if (bitmap == null) {
                Log.w(TAG, "BitmapFactory.decodeFile returned null for user " + userId);
            } else {
                Log.d(TAG, "Successfully loaded avatar for user " + userId + ", size: " + bitmap.getWidth() + "x" + bitmap.getHeight());
            }
            return bitmap;
        } catch (OutOfMemoryError e) {
            Log.e(TAG, "OutOfMemoryError when loading avatar for user " + userId, e);
            return null;
        } catch (Exception e) {
            Log.e(TAG, "Unexpected error loading avatar for user " + userId, e);
            return null;
        }
    }
}